package com.tdam2011.grupo04;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog.Calls;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.tdam2011.grupo04.entidades.Llamada;

public class HistorialLlamadas extends MasterListActivity implements
		OnItemClickListener {

	private Llamada contactoDialog;

	private llamadasHistorialAdapter adapter;

	protected final int ENTRANTRE = 1;
	protected final int SALIENTE = 2;
	protected final int PERDIDA = 3;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.historial_llamadas);

		this.getListView().setOnItemClickListener(this);
		this.getListView().setTextFilterEnabled(true);

	}

	@Override
	protected void onResume() {
		super.onResume();
		cargarHistorialLlamadas();
	}

	@Override
	protected Dialog onCreateDialog(int id) {
		Dialog dialogo = null;
		dialogo = crearDialogoConfirmacion();
		return dialogo;
	}

	private Dialog crearDialogoConfirmacion() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);

		builder.setTitle("Confirmacion");
		builder.setMessage("�Desea llamar al contacto?");
		builder.setPositiveButton("Aceptar", new OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				llamarContacto();
				dialog.cancel();
			}
		});
		builder.setNegativeButton("Cancelar", new OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				dialog.cancel();
			}
		});

		return builder.create();
	}

	public void llamarContacto() {
		Intent intent = new Intent(Intent.ACTION_CALL);
		intent.setData(Uri.parse("tel:" + contactoDialog.getTelefono()));
		startActivity(intent);
	}

	public void cargarHistorialLlamadas() {
		// Preparamos la lista de contactos
		this.adapter = new llamadasHistorialAdapter();
		this.setListAdapter(adapter);

		// Cargamos datos en la agenda de contactos
		cargarAgenda();
	}

	@Override
	protected void publishFilterApplied() {
		super.publishFilterApplied();
		this.cargarAgenda();
	}

	private void cargarAgenda() {
		adapter.clearList();

		String[] columnas = new String[] { Calls._ID, Calls.TYPE, Calls.NUMBER,
				Calls.CACHED_NAME };
		Uri llamadasUri = Calls.CONTENT_URI;
		ContentResolver cr = getContentResolver();
		Cursor cur = cr.query(llamadasUri, columnas, // Columnas a devolver
				null, // Condici�n de la query
				null, // Argumentos variables de la query
				"_ID DESC"); // Orden de los resultados

		Llamada llamada = null;
		while (cur.moveToNext()) {
			String nombreContacto = cur.getString(cur
					.getColumnIndex(Calls.CACHED_NAME));
			String telefono = cur.getString(cur.getColumnIndex(Calls.NUMBER));

			llamada = new Llamada();
			llamada.setId(cur.getInt(cur.getColumnIndex(Calls._ID)));
			llamada.setTipo(cur.getInt(cur.getColumnIndex(Calls.TYPE)));
			llamada.setTelefono(telefono);
			llamada.setNombreContacto(nombreContacto);
            if(llamada.getNombreContacto() != null && (!contactFilterApplied || llamada.getNombreContacto().toLowerCase().startsWith(contactFilter))){
				adapter.addLlamada(llamada);
			}
		}

		adapter.notifyDataSetChanged();
	}

	class llamadasHistorialAdapter extends BaseAdapter implements Filterable {
		private ArrayList<Llamada> llamadas;
		private LayoutInflater inflater;
		private ContactFilter filter;

		public llamadasHistorialAdapter() {
			llamadas = new ArrayList<Llamada>();
			inflater = LayoutInflater.from(HistorialLlamadas.this);
		}

		public void addLlamada(Llamada llamada) {
			if (llamadas != null)
				this.llamadas.add(llamada);
		}

		public int getCount() {
			return llamadas.size();
		}

		public Object getItem(int position) {
			return llamadas.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public void clearList() {
			llamadas.clear();
		}

		class Holder {
			private TextView nombre;
			private TextView numero;
			private ImageView img_rumbo_accion;
		}

		public View getView(int position, View convertView, ViewGroup arg2) {
			Holder holder;
			if (convertView == null) {
				convertView = inflater.inflate(
						R.layout.historial_llamadas_contacto, null);
				holder = new Holder();
				holder.nombre = (TextView) convertView
						.findViewById(R.id.historial_nombre);
				holder.numero = (TextView) convertView
						.findViewById(R.id.historial_nroTelefono);
				holder.img_rumbo_accion = (ImageView) convertView
						.findViewById(R.id.historial_img_rumboAccion);

				convertView.setTag(holder);
			} else {
				holder = (Holder) convertView.getTag();
			}

			Llamada llamada = (Llamada) getItem(position);
			if (llamada.getNombreContacto() != null) {
				holder.nombre.setText(llamada.getNombreContacto());
			} else {
				holder.nombre.setText("Desconocido");
			}
			holder.numero.setText(llamada.getTelefono());

			if (llamada.getTipo() == ENTRANTRE) {
				holder.img_rumbo_accion.setImageResource(R.drawable.entrante);
			} else if (llamada.getTipo() == SALIENTE) {
				holder.img_rumbo_accion.setImageResource(R.drawable.saliente);
			} else if (llamada.getTipo() == PERDIDA) {
				holder.img_rumbo_accion.setImageResource(R.drawable.perdida);
			}
						
			return convertView;
		}

		@Override
		public Filter getFilter() {
			if (filter == null) {
				filter = new ContactFilter();
			}
			return filter;
		}
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position,
			long arg3) {
		contactoDialog = (Llamada) adapter.getItem(position);
		showDialog(1);
	}
}
